perm filename CALDRV.SAI[SYS,HE] blob
sn#004269 filedate 1972-08-25 generic text, type T, neo UTF8
COMMENT ⊗ VALID 00010 PAGES
RECORD PAGE DESCRIPTION
00001 00001
00002 00002 BEGIN "CALDRV"
00005 00003 SIMPLE PROCEDURE TRANSFER(INTEGER TODSK,BLOCK REFERENCE INTEGER FLAG)
00007 00004 SIMPLE PROCEDURE FILER
00011 00005 PROCEDURE PAN_TILT_ARM_CAL
00015 00006 IF (EYEFLG≠0)∧(MANU≠0) THEN BEGIN
00019 00007 PROCEDURE FOC_ARM_CAL
00022 00008
00024 00009 PROCEDURE CALCHK
00026 00010 IF RUN≠0 THEN BEGIN
00029 ENDMK
⊗;
BEGIN "CALDRV"
REQUIRE "PREAMB.SAI[SYS,HE]" SOURCE_FILE;
REAL ARRAY PPOT0,PPOTD,TPOT0,TPOTD,FPOT0,FPOTD,MART,SWING,
FOC,FOCLEN0,FOCLENG[1:4],DP,P0[1:4,1:3],PP[1:4,1:2];
INTEGER MESS;
REAL GCOR;
DEFINE CRLF="&'15&'12"; DEFINE YES="INCHWL=""Y""";
DEFINE ⊃="COMMENT"; DEFINE S_O_T="STOP_ON_TOUCH";
REQUIRE "HANDSER.SAI[SYS,HE]" SOURCE_FILE;
SIMPLE PROCEDURE LINEFIT(INTEGER N; REAL ARRAY MES; STRING INTNAME, SLOPNAME;
REFERENCE REAL INTERCEPT,SLOPE);
BEGIN "LINEFIT"
REAL X,Y,SX,SY,SQX,SQY,SXY,NEWINT,NEWSLOP;
INTEGER I;
SX←SY←SQX←SQY←SXY←0;
FOR I←1 STEP 1 UNTIL N DO BEGIN
X←MES[I,1]; Y←MES[I,2];
SX←SX+X; SY←SY+Y; SQX←SQX+X↑2; SQY←SQY+Y↑2; SXY←SXY+X*Y; END;
OUTSTR("...TYPE Y TO UPDATE "&INTNAME&" ONLY:"CRLF);
IF YES
THEN NEWSLOP←SLOPE
ELSE NEWSLOP←(N*SXY-SX*SY)/(N*SQX-SX↑2);
NEWINT←(SY-NEWSLOP*SX)/N;
OUTSTR("LINEFIT: "&INTNAME&"="&CVG(INTERCEPT)&SLOPNAME&"="&CVG(SLOPE)CRLF);
OUTSTR(" N="&CVS(N)&" NEW_"&INTNAME&"="&CVG(NEWINT)&
"NEW_"&SLOPNAME&"="&CVG(NEWSLOP)CRLF);
OUTSTR("...TYPE Y TO UPDATE:"CRLF);
IF YES THEN BEGIN INTERCEPT←NEWINT; SLOPE←NEWSLOP; END;
END "LINEFIT";
SIMPLE REAL PROCEDURE COSQR(REAL A,B,C);
⊃ Solves the eq. Acos(x)+Bsin(x)+C=0 for x;
BEGIN FORTRAN REAL PROCEDURE ACOS(REAL X);
FORTRAN REAL PROCEDURE SQRT(REAL X);
REAL K,M,N;
K←A*C; M←A↑2+B↑2; N←B↑2-C↑2;
IF A*B<0
THEN RETURN(ACOS(-(K/M)+SQRT((K/M)↑2+(N/M))))
ELSE RETURN(ACOS(-(K/M)-SQRT((K/M)↑2+(N/M))));
END "COSQR";
SIMPLE PROCEDURE TRANSFER(INTEGER TODSK,BLOCK; REFERENCE INTEGER FLAG);
BEGIN INTEGER DUMMY;
DEFINE XFR(EX)="IF TODSK THEN ARRYOUT(3,EX,1) ELSE ARRYIN(3,EX,1)";
OPEN(3,"DSK",12,3,3,0,0,0);
LOOKUP(3,"DATA[SYS,HE]",FLAG);
IF FLAG THEN BEGIN OUTSTR("TRANSFER-FAILED: LOOKUP FAILED (BLOCK="&
CVS(BLOCK)&")"CRLF); RETURN; END;
USETI(3,1); DUMMY←WORDIN(3);
IF TODSK THEN BEGIN ENTER(3,"DATA[SYS,HE]",FLAG);
IF FLAG THEN BEGIN OUTSTR("TRANSFER-FAILED: ENTER FAILED (BLOCK="&
CVS(BLOCK)&")"CRLF); RETURN; END; END;
IF TODSK THEN USETO(3,BLOCK) ELSE USETI(3,BLOCK);
XFR(PPOT0[BLOCK]); XFR(PPOTD[BLOCK]); XFR(TPOT0[BLOCK]); XFR(TPOTD[BLOCK]);
XFR(FPOT0[BLOCK]); XFR(FPOTD[BLOCK]);
XFR(MART[BLOCK]); XFR(SWING[BLOCK]);
XFR("PP[BLOCK,1]");XFR("PP[BLOCK,2]");XFR("P0[BLOCK,1]");XFR("P0[BLOCK,2]");
XFR("P0[BLOCK,3]");XFR("DP[BLOCK,1]");XFR("DP[BLOCK,2]");XFR("DP[BLOCK,3]");
XFR(FOC[BLOCK]); XFR(FOCLEN0[BLOCK]); XFR(FOCLENG[BLOCK]);
RELEASE(3);
END "TRANSFER";
SIMPLE PROCEDURE FILER;
BEGIN "FILER"
INTEGER LPT,FLAG,BLOCK,TODSK; STRING ST;
DEFINE CHANGEF(VAR)="OUTSTR(""VAR""&""=""&CVG(VAR)&""...TYPE NEW"");
OUTSTR("" VALUE OR CR.=""CRLF);
IF (ST←INCHWL)≠NULL THEN VAR←REALSCAN(ST,FLAG);";
LPT←0; BLOCK←1;
CHANGEF(BLOCK);
OUTSTR("...TYPE Y WRITE ON DSK, CR TO READ FROM DSK INTO MEMORY:"CRLF);
IF YES
THEN BEGIN
OUTSTR("...TYPE Y FOR MANUAL:"CRLF);
IF YES THEN BEGIN
CHANGEF(PPOT0[BLOCK]); CHANGEF(PPOTD[BLOCK]); CHANGEF(TPOT0[BLOCK]);
CHANGEF(TPOTD[BLOCK]); CHANGEF(FPOT0[BLOCK]); CHANGEF(FPOTD[BLOCK]);
CHANGEF(MART[BLOCK]); CHANGEF(SWING[BLOCK]);
CHANGEF("PP[BLOCK,1]"); CHANGEF("PP[BLOCK,2]");
CHANGEF("P0[BLOCK,1]"); CHANGEF("P0[BLOCK,2]"); CHANGEF("P0[BLOCK,3]");
CHANGEF("DP[BLOCK,1]"); CHANGEF("DP[BLOCK,2]"); CHANGEF("DP[BLOCK,3]");
CHANGEF(FOC[BLOCK]); CHANGEF(FOCLEN0[BLOCK]); CHANGEF(FOCLENG[BLOCK]);
END;
TRANSFER(1,BLOCK,FLAG); END
ELSE BEGIN TRANSFER(0,BLOCK,FLAG); IF FLAG THEN RETURN;
OUTSTR("...TYPE Y TO PRINT, CR TO DISPLAY:"CRLF);
IF YES
THEN BEGIN OPEN(4,"LPT",0,0,2,0,0,0); LPT←1; END
ELSE OPEN(4,"TTY",0,0,2,0,0,0);
SETFORMAT(2,6);
OUT(4," CURRENT MODEL IN BLOCK NUMBER "&CVS(BLOCK)CRLF CRLF);
OUT(4," PPOT0 PPOTD TPOT0 TPOTD"&
" FPOT0 FPOTD"CRLF&" "&CVG(PPOT0[BLOCK])
&CVG(PPOTD[BLOCK])&CVG(TPOT0[BLOCK])&CVG(TPOTD[BLOCK])
&CVG(FPOT0[BLOCK])&CVG(FPOTD[BLOCK])CRLF CRLF);
OUT(4," MART SWING"CRLF&" "
&CVG(MART[BLOCK])&CVG(SWING[BLOCK])CRLF CRLF);
OUT(4," PP[1] PP[2]"CRLF&" "&CVG(PP[BLOCK,1])&
CVG(PP[BLOCK,2])CRLF CRLF);
OUT(4," P0[1] P0[2] P0[3]"CRLF&" "
&CVG(P0[BLOCK,1])&CVG(P0[BLOCK,2])&CVG(P0[BLOCK,3])CRLF CRLF);
OUT(4," DP[1] DP[2] DP[3]"CRLF&" "
&CVG(DP[BLOCK,1])&CVG(DP[BLOCK,2])&CVG(DP[BLOCK,3])CRLF CRLF);
OUT(4," FOC FOCLEN0 FOCLENG"CRLF&" "
&CVG(FOC[BLOCK])&CVG(FOCLEN0[BLOCK])&CVG(FOCLENG[BLOCK])CRLF);
SETFORMAT(0,6);
IF LPT=1 THEN RELEASE(4); END;
END "FILER";
PROCEDURE PAN_TILT_ARM_CAL;
BEGIN
REAL XERR,YERR,DX,DY,DZ,XH,YH,RAN,RAND,FMX,FMY,SXERR,SYERR,DIRX,DIRY,
TET,TETI,TETF,TETD,XTC,YTC,ZTC,NPPOT0,NPPOTD,NTPOT0,NTPOTD,
SQXERR,SQYERR,XERRI,YERRI,PAN,TILT,XCC,YCC,ZCC,RANG,D,ALPHA,BETA;
INTEGER N,I,J,FLAG,MANU,RLENS,INI;
REAL ARRAY DIRD[1:8],MESPAN,MESTIL[1:20,1:2];
LABEL LAC,MAR;
FORTRAN REAL PROCEDURE COS(REAL X);
FORTRAN REAL PROCEDURE SIN(REAL X);
FORTRAN REAL PROCEDURE SQRT(REAL X);
OUTSTR("...TYPE THE LENS NO. YOU WANT TO USE="CRLF);
RLENS←CVD(INCHWL);
MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_LENS(RLENS));
IF CAMFLG≠0 THEN RETURN;
LOOK_AT[1]←1;
IF RLENS=1 THEN LOOK_AT[4]←LOOK_AT[5]←12 ELSE LOOK_AT[4]←LOOK_AT[5]←18;
N←0; SXERR←SYERR←0; XERRI←YERRI←0;
DX←-.3; DY←-((GRASP-GCOR)/2+.55); DZ←0;
OUTSTR("...TYPE Y TO UPDATE FROM ALL OVER THE TABLE :"CRLF);
IF YES THEN BEGIN RAND←10.0; TETI←0.0; TETD←.314; TETF←3.2; END
ELSE BEGIN RAND←5.0; TETI←.6; TETD←.4; TETF←2.25; END;
OUTSTR("...TYPE Y IF YOU WANT TO HELP:"CRLF);
IF YES THEN MANU←1 ELSE MANU←0;
FOR RAN←15.0 STEP RAND UNTIL 25.0 DO BEGIN XERR←XERRI; YERR←YERRI; INI←0;
FOR TET←TETI STEP TETD UNTIL TETF DO BEGIN
XH←20-RAN*COS(TET); YH←10+RAN*SIN(TET);
IF (XH<0)∨(XH>40)∨(YH<5)∨(YH>36) THEN GOTO LAC;
OUTSTR("PTAC: SENDING ARM TO: XH="&CVG(XH)&" YH="&CVG(YH)CRLF);
DIRY←SQRT((XH-CAMERA_MODEL[4,1])↑2+(YH-CAMERA_MODEL[4,2])↑2);
DIRX←(XH-CAMERA_MODEL[4,1])/DIRY;
DIRY←(YH-CAMERA_MODEL[4,2])/DIRY;
POSE_HAND(XH,YH,1,DIRX,DIRY,FLAG);
IF FLAG≠0 THEN GOTO LAC;
ARMTRAN(DX,DY,DZ,XTC,YTC,ZTC);
MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_CENTER(RLENS,XTC,YTC,ZTC));
IF CAMFLG≠0 THEN GOTO LAC;
CORN_HAND(DX,DY,DZ,DIRD);
LOOK_AT[2]←DIRD[5]-XERR; LOOK_AT[3]←DIRD[6]-YERR;
MESS←ISSUE(7,"DRV","EYE",MESSAGE SRCH_IMAGE(1,1,3,.05,DIRD));
IF (EYEFLG≠0)∧(MANU=0) THEN GOTO LAC;
IF (EYEFLG≠0)∧(MANU≠0) THEN BEGIN
MAR: OUTSTR("...TO HELP, MOVE THE CAMERA IF NEEDED AND THEN TYPE Y:"CRLF);
IF YES
THEN BEGIN MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_UPDATE);
IF CAMFLG≠0 THEN GOTO MAR;
CORN_HAND(DX,DY,DZ,DIRD);
MESS←ISSUE(7,"DRV","EYE",MESSAGE SET_WINDOW);
IF EYEFLG≠0 THEN GOTO MAR;
MESS←ISSUE(7,"DRV","EYE",MESSAGE SRCH_IMAGE(1,1,3,.05,DIRD));
IF EYEFLG≠0 THEN GOTO MAR; END
ELSE GOTO LAC; END;
XERR←DIRD[5]-DIR_EYE[1,5]; YERR←DIRD[6]-DIR_EYE[1,6];
SXERR←SXERR+XERR; SYERR←SYERR+YERR;
SQXERR←SQXERR+XERR*XERR; SQYERR←SQYERR+YERR*YERR;
OUTSTR("PTAC: XIERR="&CVG(XERR)&" YIERR="&CVG(YERR)CRLF);
IF INI=0 THEN BEGIN INI←1; XERRI←XERR; YERRI←YERR; END;
N←N+1;
FMY←FPOTD[RLENS]*FOCPOT+FPOT0[RLENS]; FMX←FMY*MART[RLENS];
ALPHA←(DIR_EYE[1,5]-PP[RLENS,1])/FMX;
BETA← (DIR_EYE[1,6]-PP[RLENS,2]+DIR_EYE[1,5]/333)/FMY;
XCC←P0[RLENS,1]-XTC; YCC←P0[RLENS,2]-YTC; ZCC←P0[RLENS,3]-ZTC;
PAN←COSQR(YCC,-XCC,DP[RLENS,1]);
D←XCC*COS(PAN)+YCC*SIN(PAN);
TILT←COSQR(ZCC,-D,-DP[RLENS,2]);
RANG←D*COS(TILT)+ZCC*SIN(TILT)-DP[RLENS,3];
MESPAN[N,1]←PANPOT;
MESPAN[N,2]←PAN+ALPHA*RANG/D;
MESTIL[N,1]←TILPOT;
MESTIL[N,2]←TILT-RANG*(BETA-ALPHA*DP[RLENS,1]*SIN(TILT)/D)/(RANG+DP[RLENS,3]);
LAC: END; END;
SXERR←SXERR/N; SYERR←SYERR/N;
SQXERR←SQRT(SQXERR/N-SXERR↑2); SQYERR←SQRT(SQYERR/N-SYERR↑2);
OUTSTR("PTAC: MEAN=("&CVG(SXERR)&CVG(SYERR)&") S.D.=("&
CVG(SQXERR)&CVG(SQYERR)&")"CRLF);
LINEFIT(N,MESPAN,"PPOT0["&CVS(RLENS)&"]","PPOTD["&CVS(RLENS)&"]",
PPOT0[RLENS],PPOTD[RLENS]);
LINEFIT(N,MESTIL,"TPOT0["&CVS(RLENS)&"]","TPOTD["&CVS(RLENS)&"]",
TPOT0[RLENS],TPOTD[RLENS]);
OUTSTR("...TYPE Y TO UPDATE THE DSK:"CRLF);
IF YES THEN BEGIN
TRANSFER(1,RLENS,FLAG);
IF ¬ FLAG THEN MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_INIT);
END;
HOME_ARM;
END"PAN_TILT_ARM_CAL";
PROCEDURE FOC_ARM_CAL;
BEGIN REAL ARRAY MESFOC[1:20,1:2],DIRD[1:8];
INTEGER N,MANU,I,RLENS,FLAG;
REAL XH,YH,RANG,XTC,YTC,ZTC,DX,DY,DZ,RINVAL,DIRX,DIRY;
LABEL LAC;
FORTRAN REAL PROCEDURE SQRT(REAL X);
OUTSTR("...TYPE THE LENS NO. YOU WANT TO USE="CRLF);
RLENS←CVD(INCHWL);
MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_LENS(RLENS));
IF CAMFLG≠0 THEN RETURN;
IF RLENS=1 THEN LOOK_AT[4]←LOOK_AT[5]←12 ELSE LOOK_AT[4]←LOOK_AT[5]←18;
OUTSTR("...TYPE Y FOR MANUAL FOCUS SETTING:"CRLF);
IF YES THEN MANU←0 ELSE MANU←1;
LOOK_AT[1]←1;
N←0;
DX←-.3; DY←-((GRASP-GCOR)/2+.55); DZ←0;
FOR I←0 STEP 1 UNTIL 7 DO BEGIN
XH←4+I*4; YH←19+I*2;
OUTSTR("FAC: SENDING ARM TO: XH="&CVG(XH)&" YH="&CVG(YH)CRLF);
DIRY←SQRT((XH-CAMERA_MODEL[4,1])↑2+(YH-CAMERA_MODEL[4,2])↑2);
DIRX←(XH-CAMERA_MODEL[4,1])/DIRY;
DIRY←(YH-CAMERA_MODEL[4,2])/DIRY;
POSE_HAND(XH,YH,1,DIRX,DIRY,FLAG);
IF FLAG≠0 THEN GOTO LAC;
ARMTRAN(DX,DY,DZ,XTC,YTC,ZTC);
MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_CENTER(RLENS,XTC,YTC,ZTC));
IF CAMFLG≠0 THEN GOTO LAC;
IF MANU=0
THEN BEGIN OUTSTR("...CHANGE TO MAN CONTROL AND FOCUS CAREFULLY..."CRLF);
OUTSTR("...WHEN DONE CHNGE BACK TO CPTR AND TYPE Y:"CRLF);
IF YES THEN;
MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_UPDATE);
IF CAMFLG≠0 THEN GOTO LAC; END
ELSE BEGIN
CORN_HAND(DX,DY,DZ,DIRD);
LOOK_AT[2]←DIRD[5]; LOOK_AT[3]←DIRD[6];
MESS←ISSUE(7,"DRV","EYE",MESSAGE SRCH_IMAGE(1,1,3,.05,DIRD));
IF EYEFLG≠0 THEN GOTO LAC;
RINVAL←CAMRANG/(2*RLENS);
MESS←ISSUE(7,"DRV","FOC",MESSAGE AUTOFOC(CAMRANG,RINVAL,4));
IF FOCFLG≠0 THEN GOTO LAC;
END;
N←N+1;
RANG←SQRT((XTC-CAMERA_MODEL[4,1])↑2+(YTC-CAMERA_MODEL[4,2])↑2
+(ZTC-CAMERA_MODEL[4,3])↑2);
MESFOC[N,1]←FOCPOT; MESFOC[N,2]←FOC[RLENS]*RANG/(RANG-FOC[RLENS]);
LAC: END;
OUTSTR("...FOR LENS NO 1 UPDATE FOCLEN0[1] ONLY..."CRLF);
LINEFIT(N,MESFOC,"FOCLEN0["&CVS(RLENS)&"]","FOCLENG["&CVS(RLENS)&"]",
FOCLEN0[RLENS],FOCLENG[RLENS]);
FOCLENG[1]←FOCLENG[2];
OUTSTR("...TYPE Y TO UPDATE THE DSK:"CRLF);
IF YES THEN BEGIN
FOR I←1 STEP 1 UNTIL 4 DO TRANSFER(1,I,FLAG);
MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_INIT);
END;
HOME_ARM;
END "FOC_ARM_CAL";
PROCEDURE CALCHK;
BEGIN INTEGER RLENS;
REAL XTC,YTC,RANG;
LABEL NEG;
REAL ARRAY DIRD[1:8];
FORTRAN REAL PROCEDURE SQRT(REAL X);
OUTSTR("...TYPE THE LENS NO. YOU WANT TO USE="CRLF);
RLENS←CVD(INCHWL);
MESS←ISSUE(7,"DRV","CAM",MESSAGE CHNG_LENS(RLENS));
IF CAMFLG≠0 THEN RETURN;
LOOK_AT[1]←1;
NEG: OUTSTR("...CHANGE TO MAN CONTROL, MOVE AND FOCUS ..."CRLF);
OUTSTR("...WHEN DONE CHNGE BACK TO CPTR AND TYPE Y:"CRLF);
IF YES THEN;
MESS←ISSUE(7,"DRV","CAM",MESSAGE CAM_UPDATE);
IF CAMFLG≠0 THEN GOTO NEG;
MESS←ISSUE(7,"DRV","EYE",MESSAGE SET_WINDOW);
IF EYEFLG≠0 THEN GOTO NEG;
MESS←ISSUE(7,"DRV","EYE",MESSAGE SRCH_IMAGE(1,1,0,-1,DIRD));
IF EYEFLG≠0 THEN GOTO NEG;
TABLECOR(DIR_EYE[1,5],DIR_EYE[1,6],XTC,YTC);
OUTSTR("CALCHK: CORNER AT XTC="&CVG(XTC)&"YTC="&CVG(YTC)CRLF);
RANG←SQRT((XTC-CAMERA_MODEL[4,1])↑2+(YTC-CAMERA_MODEL[4,2])↑2+
(CAMERA_MODEL[4,3])↑2);
OUTSTR("CALCHK: RANG="&CVG(RANG)&"CAMRANG="&CVG(CAMRANG)CRLF);
END"CALCHK";
IF RUN≠0 THEN BEGIN
PUT_DATA(0,0,"DRV");
OUTSTR("CALDRV-WAITING"CRLF);
WHILE (¬YES_CAM)∨(¬YES_EYE)∨(¬YES_HAND)∨(¬YES_FOC) DO CALL(1,"SLEEP");
OUTSTR("CALDRV-ACTIVATED"CRLF);
HOME_ARM; GCOR←GRASP_CAL; END;
BEGIN INTEGER BLOCK,FLAG;
FOR BLOCK←1 STEP 1 UNTIL 4 DO TRANSFER(0,BLOCK,FLAG); END;
IF RUN=0 THEN FILER ELSE
BEGIN LABEL TIT; INTEGER REQUEST;
TIT: OUTSTR("1-READ AND WRITE THE CAMERA MODEL ON THE DSK"CRLF);
OUTSTR("2-UPDATE PAN/TILT CALIBRATION FROM THE ARM"CRLF);
OUTSTR("3-UPDATE PAN/TILT CALIBRATION FROM THE TABLE(NOT YET)"CRLF);
OUTSTR("4-UPDATE FOCUS CALIBRATION FROM THE TABLE(NOT YET)"CRLF);
OUTSTR("5-UPDATE FOCUS CALIBRATION FROM THE ARM"CRLF);
OUTSTR("6-MANUAL CHECK OF CALIBRATION "CRLF);
OUTSTR("...TYPE THE NO. OF PROCEDURE TO EXECUTE NOW="CRLF);
REQUEST←CVD(INCHWL);
IF (REQUEST<1)∨(REQUEST>6) THEN BEGIN
OUTSTR("MAIN: ILLEGAL PROCEDURE NO. ("&CVS(REQUEST)&")"CRLF);
GOTO TIT; END;
CASE REQUEST OF BEGIN
BEGIN ⊃ 0; END;
BEGIN ⊃ 1; FILER; END;
BEGIN ⊃ 2; PAN_TILT_ARM_CAL; END;
BEGIN ⊃ 3; END;
BEGIN ⊃ 4; END;
BEGIN ⊃ 5;FOC_ARM_CAL; END;
BEGIN ⊃ 6;CALCHK; END;
END;
OUTSTR("...TYPE Y TO TEST AGAIN:"CRLF);
IF INCHWL="Y" THEN GOTO TIT; END;
END "CALDRV";